'''
控制灯光DEMO
张浩 2019年11月25日

1  需要提前安装mqtt库：pip install paho-mqtt

2  测试时需要手机开启名称为：zhanghao 密码为：123456789 的热点供给灯具使用

3   命令说明：
    A0--//亮度 0-255
    A1--//色温 0-255
    A4--//循环时长  控制渐变和呼吸灯的速度 取值0-100
    A5--//RGB-R 0-255
    A6--//RGB-G 0-255
    A7--//RGB-B 0-255
    A8--//Model 0-正常模式 1-旋转 2-爆闪 3-渐变色 4-显示任意颜色，取决于A5，A6，A7的值 5-呼吸灯
备注：此文件仅用于测试mqtt服务，在设备运行中不使用。
'''
import paho.mqtt.client as mqtt
import threading

# 灯具的命令Topic，往该Topic中发送命令可以控制灯具
topic = 'SL_IN_8506'


# 定义几个常用的命令
cmdON = b"{A0=255,A8=0}"
cmdOFF = b"{A0=0,A8=0}"

cmdColor = b"{A5=255,A6=0,A7=0,A8=4}"
cmdBaoshan = b"{A8=2}"

cmdList = [cmdON,cmdOFF,cmdColor,cmdBaoshan]


# 链接服务器成功时的回调函数，在该函数中订阅SL_IN_8506话题
def on_connect(client, userdata, flags, rc):
    client.subscribe("SL_OUT_8266")

# 接收消息的回调函数，用来接收灯具的回复，可忽略。
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

# 创建MQTT连接并设置回调函数
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

# 连接服务器
client.connect("mmradar.top", 1883, 60)

# MQTT消息检测线程，需要一直运行
def mqttLoop():
    print('mqttThread started')
    client.loop_forever()


# 发送命令线程
def cmdLoop():
    while True:
        cmd = input('请选择命令[0-开灯；1-关灯；2-红色；3-爆闪]：')
        print(cmdList[int(cmd)])
        client.publish(topic, cmdList[int(cmd)])


# 设置mqtt线程并启动
mqttThread = threading.Thread(target=mqttLoop, name='mqttThread')
mqttThread.start()

# 发送命令线程
cmdThread = threading.Thread(target=cmdLoop, name='cmdThread')
cmdThread.start()

